iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0

一. 預訓練的BERT

接下來會介紹hugging face這個團隊提供的BERT的套件來做介紹~BERT的model本質本來就是預訓練模型。今天主要介紹 Bert 預訓練模型的使用方法。

如下圖,此圖來自Coupy的'NLP 100天馬拉松'的圖,網路上有人利用BERT將句子轉成編碼,再經過自己設計好的分類器,如羅吉斯回歸、LSTM都可以唷~~
https://ithelp.ithome.com.tw/upload/images/20210929/201404268BGQSQzoT8.png

二. 程式實現

接下來我們載入google 的 BERT,並利用他來轉換成句子的編碼

  • 載入套件
import numpy as np
import pandas as pd
import torch
import transformers as ppb # pytorch transformers
  • bert 的config設定
configuration = ppb.BertConfig()
configuration

輸出後如下圖:
https://ithelp.ithome.com.tw/upload/images/20210929/20140426nA6OjaECrN.png

  • 文字前處理,以句子'為什麼聖結石會被酸而這群人不會'為例
def tokenize(text):
  text = re.sub('[^\u4e00-\u9fa5A-Za-z0-9]','',text)

  return text

text = '為什麼聖結石會被酸而這群人不會'
train_text = tokenize(text)
  • 載入pre-trained model
# 載入 Bert 模型
model_class, tokenizer_class, pretrained_weights = (ppb.BertModel(configuration), ppb.BertTokenizer, 'bert-base-chinese')

# 載入預訓練權重以及 tokenizer
tokenizer = tokenizer_class.from_pretrained(pretrained_weights)
model = model_class.from_pretrained(pretrained_weights)
  • 將句子裡的詞編號:
max_len = 32
train_text = tokenizer.encode(train_text, add_special_tokens=True, max_length=max_len, truncation=True, padding=True)
train_text

輸出後如下圖:
https://ithelp.ithome.com.tw/upload/images/20210929/20140426ma7RHpScun.png

  • BERT的輸入需要有input_idx(上一步)、padding的idx(後面補0)、attention mask(要做attention的詞設為1,padding的詞設為0):
padded = np.array([train_text + [0]*(max_len-len(train_text))])
attention_mask = np.where(padded != 0, 1, 0)
input_ids = torch.tensor(padded).to(torch.int64)
attention_mask = torch.tensor(attention_mask).to(torch.int64)

with torch.no_grad():
    last_hidden_states = model(input_ids, attention_mask=attention_mask)
  • 最後將'為什麼聖結石會被酸而這群人不會'進行編碼,通常是取pooler_output作為句子的編碼,如下:
last_hidden_states.pooler_output

output,編碼為768維度的向量:
https://ithelp.ithome.com.tw/upload/images/20210929/20140426VYl2uZm7HT.png


bert其實對於句子的編碼語意理解那邊是不太好,滿多人推薦SBERT這個方法,有興趣可以查一下唷~~


上一篇
[Day28] BERT(一)
下一篇
[Day30] BERT(三)
系列文
30天初步了解自然語言處理-自學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言